Programadores profesionales

Las diferencias en el aspecto educativo y laboral entre programadores de Estados Unidos y de América Latina en 2020

Integrantes

  • Luis Berrospi (líder)

  • Bryan Castillo

  • Luis Robledo

  • Jorge Collazos

  • Nincol Quiroz

Actividades

Semana Actividad
2 Búsqueda de temas y Bases de datos
2 (P0) Realizar documento
3 Definir variables y datos
4 Realizar Introducción y objetivos
5 (P1) Clasificar y describir variables
6 Feedback P1 y descripción de datos
7 Identificar modelos de variable aleatoria
8 (P2) Hipótesis de relación entre variables
9 Feedback P2
10 Realizar análisis de fiabilidad
11 Realizar pruebas de hipótesis o intervalos de confianza
12 Revisar relaciones entre variables (regresión)
14 (P3) Revisar Formato de entrega
15 Feedback P3 y revisar variables más importantes del proyecto
16 (P4) Reflexión sobre preguntas iniciales

Introducción

Son muchas las personas que se dedican profesionalmente a programar en todo el mundo. Sin embargo, las características de estas y el contexto en el que viven no son iguales. Tenemos la hipótesis de que el lugar de procedencia influye bastante en la situación tanto laboral como educativa de los programadores profesionales, por lo que decidimos realizar este análisis concentrándonos en lugares bastante distintos en desarrollo respecta, Latino América y Estados Unidos. Este estudio es importante porque lograremos observar si es que realmente existen estas diferencias. Además, si las hay, podremos identificar donde es que se encuentran para poder sugerir que es lo que una región está haciendo mejor o peor que la otra y se pueda encontrar una solución al verdadero problema.

Objetivos

En este estudio tenemos los siguientes objetivos:

  • Identificar la existencia de diferencias en el aspecto educativo y laboral entre programadores profresionales de América Latina y Estados Unidos.

  • Identificar el grado de las diferencias, así como cuales son las que presentan mayor brecha

  • Identificar las variables que no presentan diferencia alguna

Marco teórico

  • Población objetivo: Personas que son o fueron programadores profesionales y son de América Latina o de Estados Unidos

  • Muestra: Programadores profesionales que usan constantemente el foro “Stack Overflow”

  • Muestreo: Por conveniencia, pues se seleccionaron a las personas que usan Stack Overflow

  • Base de Datos: La base de datos es el resultado de la Stack Overflow Developer Survey 2020, esta encuesta busca saber cómo es que aprenden, que herramientas usan y que y como se relacionan con el foro cualquier persona que sabe programar. La base de datos cuenta con cerca de 65000 observaciones totales y 61 variables, pero para este trabajo, delimitamos las observaciones según lo realmente necesitábamos.

Limpieza de datos:

Cargamos la base de datos original y procedimos a revisar los datos de las personas en las regiones que nos interesan, pudimos observar que personas que marcaron que tenían la edad de 1, 10 y 99 años, tenían otros datos irreales, como cantidad de horas trabajadas semanalmente muy altas o les faltaba una cantidad importante de datos, por estos motivos consideramos que eran datos inválidos. Por otro lado, también decidimos eliminar las observaciones que contaban con más de 120 horas trabajadas a la semana pues esto implica que trabajan más de 17 horas diarias 7 días a la semana y consideramos estos valores como ilógicos. Si bien, reconocemos que la invalidación de toda una observación por unos cuantos errores puede sesgar el estudio, los datos eliminados representan una parte minúscula de los datos restantes y consideramos que no perdemos representatividad.

Consideramos que la limpieza de datos fue suficiente puesto que aun contamos con un gran numero de datos que permiten que los indicadores prácticamente no se vean afectados por datos atípicos. Además, revisando algunos de estos datos más resaltantes, no encontramos evidencia suficiente para categorizarlos como inválidos.

Segmentación del Data Frame original:

DFF <- select(df, MainBranch, Country,Gender,Age, ConvertedComp, YearsCodePro ,EdLevel,Employment, JobSat, OrgSize, WorkWeekHrs, NEWOvertime, NEWOnboardGood, JobSeek, NEWLearn, LanguageWorkedWith, Age1stCode)
DF_USA <- DFF[DFF$Country == "United States" & !is.na(DFF$Country) & DFF$MainBranch == "I am a developer by profession" & !is.na(DFF$MainBranch), ][3:17]
DF_LA <- cbind(region = as.character(countrycode(sourcevar = DFF$Country,
                            origin = "country.name",
                            destination = "region")), DFF)
DF_LA <- DF_LA[DF_LA$region == "Latin America & Caribbean" & !is.na(DF_LA$region) & DFF$MainBranch == "I am a developer by profession" & !is.na(DFF$MainBranch), ][, 4:18]
DF_MIX <- cbind(region = as.character(countrycode(sourcevar = DFF$Country,
                            origin = "country.name",
                            destination = "region")), DFF)
DF_MIX <- DF_MIX[((DF_MIX$region == "Latin America & Caribbean" & !is.na(DF_MIX$region)) | (DF_MIX$Country == "United States" & !is.na(DF_MIX$Country))) &  DF_MIX$MainBranch == "I am a developer by profession" & !is.na(DF_MIX$MainBranch), ][, 3:18]
DF_MIX$Country[DF_MIX$Country != "United States"] <- "América Latina"
DF_MIX$Country[DF_MIX$Country == "United States"] <- "Estados Unidos"
colnames(DF_MIX)[which(names(DF_MIX) == "Country")] <- "Region"
DF_MIX

Creamos 2 data frames: DF_USA para guardar los datos de los programadores profesionales de Estados Unidos con 9452 observaciones y DF_LA para los datos de los de América Latina con 3032 observaciones. El estudio original contenía 61 variables, entre las cuales se encontraban múltiples relacionadas con el uso del foro y que no nos interesaban para este estudio, respecto a las demás variables, decidimos quedarnos con 15 que consideramos claves para describir la situación educativa y laboral de los programadores profesionales. Por último, decidimos crear un tercer data frame, DF_MIX para que sea la unión de los dos anteriores con una variable más, “Región” para distinguirlos entre los que son de Estados Unidos y de América Latina, con el objetivo de simplificar el calculo de algunos descriptores en el futuro.

Integridad de los datos

Datos Faltantes(%):

round(sum(is.na(DF_MIX))/(nrow(DF_MIX)*ncol(DF_MIX))*100, 2)
[1] 11.03

Observaciones incompletas(%):

100 - round(sum(complete.cases(DF_MIX))/(nrow(DF_MIX))*100, 2)
[1] 37.88

Podemos ver que tenemos un gran porcentaje de observaciones incompletas (34,71%), sin embargo, a estas no les faltan mucho datos, pues tenemos 10.26% de datos faltantes. No eliminaremos las observaciones incompletas pues reduciría la representatividad de nuestra muestra, así que lo que se hará será no considerar los datos NA para los indicadores en los que estos estén presentes.

Tabla descriptores

A continuación, se especifican las variables con las que trabajaremos y su tipo, así como la pregunta que se realizó originalmente en la encuesta

Pregunta Variable Tipo de Variable
Which of the following describe you, if any? Please check all that apply. If you prefer not to answer, you may leave this question blank. Género Nominal
What is your age (in years)? If you prefer not to answer, you may leave this question blank. Edad Discreta
Including any education, how many years have you been coding in total? Años programando Discreta
NOT including education, how many years have you coded professionally (as a part of your work)? Años programando profesionalmente Discreta
Which of the following best describes the highest level of formal education that you’ve completed? Grado educativo Ordinal
Which of the following best describes your current employment status? Tipo de empleo Nominal
Which programming, scripting, and markup languages have you done extensive development work in over the past year, and which do you want to work in over the next year? (If you both worked with the language and want to continue to do so, please check both boxes in that row Lenguajes con los que se trabajó Nominal
How frequently do you learn a new language or framework? Frecuencia de aprendizaje de un nuevo lenguaje/framework Ordinal
At what age did you write your first line of code or program? (e.g., webpage, Hello World, Scratch project) Edad a la que realizó primer programa Discreta
how often do you work overtime or beyond the formal time expectation of your job? Frecuencia de horas extra Ordinal
Do you think your company has a good onboarding process? (By onboarding, we mean the structured process of getting you settled in to your new role at a company) Proceso de incorporación Nominal
Which of the following best describes your current job-seeking status? Situación de empleo Nominal
How satisfied are you with your current job? (If you work multiple jobs, answer for the one you spend the most hours on.) Satisfacción laboral Ordinal
Approximately how many people are employed by the company or organization you currently work for? Cantidad de empleados Ordinal
On average, how many hours per week do you work? Please enter a whole number in the box. Horas de trabajo semanales Continua

Análisis de variables

Género

temp = DF_USA$Gender[!is.na(DF_USA$Gender)]
gender_vec_USA <- vector()
gender_vec_LA <- vector()
for (pal in temp) {
  for (sub_pal in strsplit(pal, ";")) {
    gender_vec_USA <- c(gender_vec_USA, sub_pal)
  }
}
temp = DF_LA$Gender[!is.na(DF_LA$Gender)]
gender_vec <- vector()
for (pal in temp) {
  for (sub_pal in strsplit(pal, ";")) {
    gender_vec_LA <- c(gender_vec_LA, sub_pal)
  }
}

layout(matrix(c(1,2,3,3), ncol=2, byrow=TRUE), heights=c(10, 1))
par(mai=rep(0.5, 4))

temp = table(gender_vec_USA)
man <- round(temp[1]/length(gender_vec_USA)*100,2)
other <- round(temp[2]/length(gender_vec_USA)*100,2)
woman <- round(temp[3]/length(gender_vec_USA)*100,2)
pie(table(gender_vec_USA), main = "Estados Unidos", labels = c(paste(man, "%", sep = ""), paste(other, "%", sep = ""), paste(woman, "%", sep = "")), col = c("skyblue","orange","red"))
temp = table(gender_vec_LA)

man <- round(temp[1]/length(gender_vec_LA)*100,2)
other <- round(temp[2]/length(gender_vec_LA)*100,2)
woman <- round(temp[3]/length(gender_vec_LA)*100,2)
pie(table(gender_vec_LA), main = "América Latina", labels = c(paste(man, "%", sep = ""), paste(other, "%", sep = ""), paste(woman, "%", sep = "")), col = c("skyblue","orange","red"))
par(mai=c(0,0,0,0))
plot.new()
legend(x="center", ncol=3,legend=c("Hombre","Otros","Mujer"),
       fill=c("skyblue","orange","red"))

Decidimos usar el gráfico de pie porque contamos con pocas categorías y las diferencias entre estas resaltan bastante. Podemos ver como si bien, la proporción de mujeres que se dedican en Estados Unidos es el doble que la proporción en América Latina, en ambas regiones la brecha de género es bastante grande lo que significa que la gran mayoría de los programadores profesionales son hombres.

Edad

boxplot(DF_MIX$Age~DF_MIX$Region, na.rm= T, xlab = "Edad", ylab = "Región", notch=TRUE, horizontal = TRUE, main='Edad de programadores por región')
abline(v=mean(DF_USA$Age, na.rm = TRUE), col = "red", lwd=2)
abline(v=mean(DF_LA$Age, na.rm = TRUE), col = "blue",lwd=2)
legend(60,1.7,legend=c("media EEUU", "media Latam"),col=c("red", "blue"),lwd=2)

Decidimos utilizar un gráfico de cajas y bigotes porque nos permite observar múltiples indicadores numéricos a la vez y utilizando el parámetro “notch” nos permite ver si la diferencia de las medianas son estadísticamente significativas. Podemos observar que las edades de los programadores profesionales están más concentradas en América Latina comparando los rangos intercuartílicos para ver la dispersión de los datos:

IQR(DF_LA$Age, na.rm = TRUE)
[1] 9
IQR(DF_USA$Age, na.rm = TRUE)
[1] 12

Además, podemos usar el promedio de la edad de los programadores para comparar fácilmente un representante de los programadores de cada región. Podemos ver que la edad de los profesionales de América Latina es de 30.14 mientras que en Estados Unidos es de 34.33.

round(mean(DF_LA$Age, na.rm = TRUE), 2)
[1] 30.16
round(mean(DF_USA$Age, na.rm = TRUE),2)
[1] 34.32

Calculamos las medianas para asegurarnos que los promedios no están sesgados por valores atípicos y vemos que en efecto hay una diferencia. Con estos indicadores podemos sugerir que en general, si bien, la diferencia de las medianas es estadísticamente significativa, no es mucha diferencia de edad entre los programadores profesionales de ambos países.

round(median(DF_LA$Age, na.rm = TRUE), 2)
[1] 29
round(median(DF_USA$Age, na.rm = TRUE),2)
[1] 32

Años programando

#boxplot(as.numeric(DF_MIX$ConvertedComp)~DF_MIX$Region, na.rm= TRUE, ylab = "Región", xlab = "Años", notch = TRUE, horizontal = TRUE, main='Años programando por región')
hist(DF_USA$ConvertedComp, breaks = 60, freq = TRUE, xlim = c(0, 2000000))

hist(DF_LA$ConvertedComp, breaks = 60, freq = TRUE, xlim = c(0, 2000000))

#abline(v=mean(as.numeric(DF_USA$ConvertedComp), na.rm = TRUE), col = "red")
#abline(v=mean(as.numeric(DF_LA$ConvertedComp), na.rm = TRUE), col = "blue")
#legend(25,1.7,legend=c("media EEUU", "media Latam"),col=c("red", "blue"),lwd=2)

Una vez más utilizamos el diagrama de cajas y bigotes para describir esta variable numérica por la gran cantidad de información que contiene. Aquí podemos ver como los programadores profesionales de Estados Unidos llevan más años programando en total en comparación con los de América Latina y que la diferencia de las medianas es estadísticamente significativa. Sin embargo, la diferencia es pequeña.

También, es importante destacar la gran diferencia de 6 años que existe entre el tercer cuartil de ambas regiones. Usamos este indicador para ver que el 75% de los programadores profesionales de Estados Unidos cuentan a lo mucho con 22 años programando mientras que en América latina solo 16.

round(quantile(as.numeric(DF_LA$YearsCode), na.rm = TRUE), 2)
  0%  25%  50%  75% 100% 
   1    3    6   11   50 
round(quantile(as.numeric(DF_USA$YearsCode), na.rm = TRUE),2)
  0%  25%  50%  75% 100% 
  NA   NA   NA   NA   NA 

Por último, podemos utilizar el coeficiente de variación para comparar la variabilidad de los datos, pues la forma de las cajas sugiere que la dispersión de los datos es bastante pronunciada. Sin embargo, vemos que en ambas regiones los datos varían de manera semejante en proporción al promedio de sus datos.

round(sd(as.numeric(DF_USA$YearsCode), na.rm = TRUE)/mean(as.numeric(DF_USA$YearsCode), na.rm = TRUE),2)
[1] NA
round(sd(as.numeric(DF_LA$YearsCode), na.rm = TRUE)/mean(as.numeric(DF_LA$YearsCode), na.rm = TRUE), 2)
[1] 0.85

Años programando profesionalmente

boxplot(as.numeric(DF_MIX$YearsCodePro)~DF_MIX$Region, na.rm= TRUE, ylab = "Región", xlab = "Años", notch = TRUE, horizontal = TRUE, main='Años programando profesionalmente por región')
abline(v=mean(as.numeric(DF_USA$YearsCodePro), na.rm = TRUE), col = "red")
abline(v=mean(as.numeric(DF_LA$YearsCodePro), na.rm = TRUE), col = "blue")
legend(25,1.7,legend=c("media EEUU", "media Latam"),col=c("red", "blue"),lwd=2)

En este diagrama de cajas y bigotes se observa que los programadores de Estados Unidos tienen más años programando profesionalmente en total en comparación con los programadores de América Latina.

Existe una diferencia de 4 años en el tercer cuartil de ambas regiones; es decir, el 75% de los programadores estadounidenses cuentan a los mucho con 15 años programando profesionalmente y los latinoamericanos con 11 años.

Programadores latinoamericanos

round(quantile(as.numeric(DF_LA$YearsCodePro), na.rm = TRUE), 2)
  0%  25%  50%  75% 100% 
   1    3    6   11   50 

Programadores estadounidenses

round(quantile(as.numeric(DF_USA$YearsCodePro), na.rm = TRUE),2)
  0%  25%  50%  75% 100% 
   1    4    8   15   49 

Grado educativo

tableUSA_WFR <- table(DF_USA$EdLevel)
tableUSA <- prop.table(tableUSA_WFR)
tablaUSA_DF <- data.frame(names(tableUSA_WFR), as.vector(tableUSA))
names(tablaUSA_DF) <- c('Grado estudio','Frecuencia Relativa')

tablaUSA_DF
names <- c("GA", "L", "NCE", "M", "OD", "EP", "TP", "ES", "ST")

tableLA_WFR <- table(DF_LA$EdLevel)
tableLA <- prop.table(tableLA_WFR)
tableLA_DF <- data.frame(names(tableLA_WFR), as.vector(tableLA))
names(tableLA_DF) <- c('Grado estudio','Frecuencia Relativa')
tableLA_DF
layout(matrix(c(1,2,3,3), ncol=2, byrow=TRUE), heights=c(6, 2))
par(mai=rep(0.8, 4))

barplot(tableUSA, las=2, names.arg=names, main='Grados educativos en Estados Unidos', xlab = "Grados educativos",  ylab = "Frecuencia relativa", col=c("skyblue","orange","red","beige","aliceblue","black","azure", "burlywood3", "cornflowerblue"),xlim=c(0,10), ylim = c(0, 0.6), cex.names=0.8)


barplot(tableLA, las=2, names.arg=names, main='Grados educativos en América Latina', xlab = "Grados educativos",  ylab = "Frecuencia relativa", col=c("skyblue","orange","red","beige","aliceblue","black","azure", "burlywood3", "cornflowerblue"),xlim=c(0,10), ylim = c(0, 0.6), cex.names=0.8)

par(mai=c(0,0,0,0))
plot.new()

legend(x="center", ncol=2, legend = c("Grado Asociado","Licenciatura", "Nunca Completé ninguna Educación formal", "Maestría", "Otro Doctorado", "Escuela Primaria", "Título Profesional", "Escuela Secundaria", "Estudios Superiores sin obtener un Título"), fill=c("skyblue","orange","red","beige","aliceblue","black","azure", "burlywood3", "cornflowerblue"))

En este estudio se contemplaron 9 diferentes grados de estudios, en algunos casos la diferencia entre ellos es abismal. Por lo tanto, para poder observar mejor las diferencias se utilizó gráficos de barra, además para poder tener una mejor visualización de las diferencias de frecuencia relativa entre Estados Unidos y América Latina se optó por poner los gráficos uno al costado de otro.

Los gráficos de barras muestran que la mayoría de los programadores tanto estadounidenses como latinoamericanos tienen licenciatura, si se compara, existe una mayor frecuencia relativa de programadores con licenciatura en Estados Unidos que en América Latina.

Por otro lado, en América Latina existe una mayor frecuencia relativa de programadores que no terminaron sus estudios universitarios en comparación con Estados Unidos.

Por último, podemos comprobar con la moda que el grado más común en ambas regiones es el de licenciatura.

mlv(DF_USA$EdLevel)
[1] "Bachelor’s degree (B.A., B.S., B.Eng., etc.)"
mlv(DF_LA$EdLevel)
[1] "Bachelor’s degree (B.A., B.S., B.Eng., etc.)"

Tipo de empleo

tableEmpleoUSA_WFR <- table(DF_USA$Employment)
tableEmpleoUSA <- prop.table(tableEmpleoUSA_WFR)
tableEmpleoUSA_DF <- data.frame(names(tableEmpleoUSA_WFR), as.vector(tableEmpleoUSA))
names(tableEmpleoUSA_DF) <- c('Tipo de empleo','Frecuencia Relativa')
tableEmpleoUSA_DF
namesEmpleo <- c("TC", "TP", "IA", "SEBT", "SEST", "R", "E")


tableEmpleoLA_WFR <- table(DF_LA$Employment)
tableEmpleoLA <- prop.table(tableEmpleoLA_WFR)
tableEmpleoLA_DF <- data.frame(names(tableEmpleoLA_WFR), as.vector(tableEmpleoLA))
names(tableEmpleoLA_DF) <- c('Tipo de empleo','Frecuencia Relativa')
tableEmpleoLA_DF
layout(matrix(c(1,2,3,3), ncol=2, byrow=TRUE), heights=c(8, 2))
par(mai=rep(0.8, 4))

barplot(tableEmpleoUSA, las=1, names.arg=namesEmpleo, main='Empleos en Estados Unidos', xlab = "Tipo de empleo",  ylab = "Frecuencia relativa", col=c("skyblue","orange","red","beige","aliceblue","black","blue"),xlim=c(0,8), ylim = c(0, 1), cex.names=0.8, las=2)

barplot(tableEmpleoLA, las=1, names.arg=namesEmpleo, main='Empleos en América Latina', xlab = "Tipo de empleo",  ylab = "Frecuencia relativa", col=c("skyblue","orange","red","beige","aliceblue","black","blue"),xlim=c(0,8), ylim = c(0, 1),cex.names=0.8, las=2)

par(mai=c(0,0,0,0))
plot.new()
legend(x="center", ncol=3, legend = c("Tiempo Completo","Tiempo Parcial", "Independiente, Autónomo", "Sin Empleo, Buscando Trabajo", "Sin Empleo, Sin buscar Trabajo", "Retirado", "Estudiante"), fill=c("skyblue","orange","red","beige","aliceblue","black","blue"))

En este apartado contempla 7 tipos de empleos diferentes, en algunos casos la diferencia entre ellos es abismal. Por lo tanto, para poder observar mejor las diferencias se utilizó gráficos de barra, además para poder tener una mejor visualización de las diferencias de frecuencia relativa entre Estados Unidos y América Latina se optó por poner los gráficos uno al costado de otro.

Los gráficos de barras muestran que la mayoría de los programadores tanto estadounidenses como latinoamericanos trabajan a tiempo completo, existe una mayor frecuencia relativa de programadores trabajando a tiempo completo en Estados Unidos que en América Latina.

También se puede observar que existe mayor frecuencia relativa de latinoamericanos trabajando a medio tiempo y de manera independiente que los estadounidenses.

Satisfacción con empleo

variables1 <- c("MS", "AS", "NSN", "AI", "MI")
temp = DF_USA$JobSat[!is.na(DF_USA$JobSat)]
satis_vector_USA <- vector()
satis_vector_LA <- vector()
for (pal in temp) {
  for (sub_pal in strsplit(pal, ";")) {
    satis_vector_USA <- c(satis_vector_USA, sub_pal)
  }
}
temp = DF_LA$JobSat[!is.na(DF_LA$JobSat)]
satis_vector <- vector()
for (pal in temp) {
  for (sub_pal in strsplit(pal, ";")) {
    satis_vector_LA <- c(satis_vector_LA, sub_pal)
  }
}

layout(matrix(c(1,2,3,3), ncol=2, byrow=TRUE), heights=c(7, 1))
par(mai=rep(0.8, 4))


barplot(table(satis_vector_USA)/sum(table(satis_vector_USA)), main = "Estados Unidos", names.arg = variables1, col = c("blue","orange","yellow", "green", "red"), ylab ="Frecuencias Relativas", xlab = "Grado de satisfacción")



barplot(table(satis_vector_LA)/sum(table(satis_vector_LA)), names.arg = variables1 , main = "América Latina", col = c("blue","orange","yellow", "green", "red"), ylab ="Frecuencias Relativas", xlab = "Grado de satisfacción", ylim = c(0, 0.4))

par(mai=c(0,0,0,0))
plot.new()
legend(x="center", ncol=2,legend=c("Muy Satisfecho","Algo Satisfecho","Ni Satisfecho Ni insatisfecho", "Algo Insatisfecho", "Muy Insatisfecho"), fill=c("blue","orange","yellow", "green", "red"))

Los grados de satisfacción son 5 y la diferencia entre las frecuencias relativas no son grandes, por lo tanto, es visualmente mejor comparar la frecuencia relativa de los grados de satisfacción mediante barras rectangulares, de modo que en este apartado se utiliza el grafico de barras. En la gráfica podemos ver que América Latina tiene un nivel de satisfacción mayor con su trabajo que Estado Unidos. Así mismo, en Estados Unidos el 48.18% de los encuestados están insatisfechos con su empleo. Además, la mayoría de los programadores en América Latina se encuentra ni satisfechos ni insatisfechos con su empleo.

Tamaño de organización en la que trabaja

empleados_LA <- table(DF_LA$OrgSize)
empleados_LA <- empleados_LA[c(9, 5, 2, 6, 4, 8, 1, 7, 3)]
empleados_USA <- table(DF_USA$OrgSize)
empleados_USA <- empleados_USA[c(9, 5, 2, 6, 4, 8, 1, 7, 3)]
legend_text <- c("1000 a 4999 empleados","10 a 19 eempleados", "10000 o más empleados", "100 a 499 empleados", "2 a 9 empleados", "20 a 99 empleados", "5000 a 9999 empleados", "500 a 999 empleados", "Solo yo")
legend_text <- legend_text[c(9, 5, 2, 6, 4, 8, 1, 7, 3)]
color_LA <- c("red", "yellow", "pink", "blue", "green", "orange", "black", "purple", "gray")
variables <- c(" "," "," "," "," "," "," "," "," ")

layout(matrix(c(1,2,3,3), ncol=2, byrow=TRUE), heights=c(7, 1))
par(mai=rep(0.8, 4))

barplot(empleados_LA/sum(empleados_LA), names.arg = variables, col = color_LA, ylab ="Frecuencias Relativas", las=2, ylim=c(0,0.4), xlim = c(0, 10), main = "Tamaño de las organizaciones o empresas en América Latina", cex.main=0.8)

barplot(empleados_USA/sum(empleados_USA), names.arg = variables, col = color_LA, ylab ="Frecuencias Relativas", las=2, ylim=c(0,0.4), xlim = c(0, 10), main = "Tamaño de las organizaciones o empresas en Estados Unidos", cex.main=0.8)

par(mai=c(0,0,0,0))
plot.new()
legend(x="center", ncol=3,legend=legend_text, fill=color_LA)

Al igual que en el apartado anterior se utiliza la gráfica de barras, debido a que la diferencias entre las frecuencias relativas no son muy grandes por lo tanto visualmente no se aprecia barras muy pequeñas como si su valor fuera 0. Según las gráficas de barras de Estados Unidos la mayoría de los encuestados labora en un entorno con 10000 o más empleados (frecuencia absoluta de 1915), así mismo en América Latina la mayoría de encuestados labora en un entorno de 20 a 99 empleados. #### Horas trabajadas semanalmente

horas_LA <- table(DF_LA$WorkWeekHrs)
horas_USA <- table(DF_USA$WorkWeekHrs)


mean(DF_LA$WorkWeekHrs, na.rm = TRUE)
[1] 38.33877
mean(DF_USA$WorkWeekHrs, na.rm = TRUE)
[1] 41.5872
color = c("darkblue", "skyblue")
y_LA_median <- mean(DF_LA$WorkWeekHrs, na.rm = TRUE)
y_USA_median <- mean(DF_USA$WorkWeekHrs, na.rm = TRUE)

x_general <- c("Latino América", "Estados Unidos")
y_general <- c(y_LA_median, y_USA_median)

DF_TEMP <-DF_MIX[DF_MIX$Employment == "Employed full-time" & !is.na(DF_MIX$Employment),]


boxplot(DF_TEMP$WorkWeekHrs~DF_TEMP$Region, ylab = "Región", xlab = "Horas", main="Horas trabajadas por semana", notch = FALSE, horizontal = TRUE)

Para este apartado se utiliza la gráfica de caja porque ayuda a representar gráficamente variables cuantitativas mediante la distribución de sus cuartiles, además de que permite incluir los datos atípicos, que en este caso son varios. Para la gráfica se consideró a los desarrolladores que trabajan a tiempo completo para que las unidades muestrales sean comparables. Según la gráfica, la media de horas que trabajan los encuestados por semana en América Latina es de 38.38 horas y en Estados Unidos es de 41.57. Sin embargo, si nos fijamos en que las medianas son iguales, esta diferencia no es estadísticamente significativa, por lo que podemos concluir que las horas de trabajo semanales no tienen relación con la región.

sd(DF_USA$WorkWeekHrs, na.rm = TRUE)/mean(DF_USA$WorkWeekHrs, na.rm = TRUE)
[1] 0.1897195
sd(DF_LA$WorkWeekHrs, na.rm = TRUE)/mean(DF_LA$WorkWeekHrs, na.rm = TRUE)
[1] 0.3210952

Frecuencia de horas extra en el trabajo

Decidimos usar gráficos de barras con porcentajes en base al total de encuestados por región ya que ya que la diferencia del total era grande y estos gráficos nos permiten comparar fácilmente la frecuencia de horas extra de los programadores. El uso de porcentajes y colores hace que sea un gráfico fácil de comprender para el lector.

Gracias a estos gráficos sabemos que en América Latina el 26.05% de empleados trabaja horas extra a menudo (de 1 a más días a la semana) y el 27.71% a veces (1 o 2 dos días al mes). En Estados Unidos, las 2 respuestas más votadas son “A veces” y “Ocasionalmente (1o 2 días por trimestre)”, con 26.35% y 25.71% cada una. También podemos observar que la variable “Nunca” tiene mayor porcentaje en Estados Unidos. Todo esto nos dice claramente que en América Latina los desarrolladores trabajan más horas extra a comparación de Estados Unidos, y esto podría deberse a un mejor entorno laboral.

Proceso de incorporación

Se uso gráficos de tortas ya que representa de manera ordenada y fácil de entender el porcentaje de respuestas a la pregunta por cada región.

De estos gráficos, podemos observar que tanto en América Latina como en Estados Unidos, las empresas tienen un buen proceso de incorporación (no todas), pero es ligeramente mejor en Estados Unidos, lo que implica que en América Latina existen más empresas con un mal proceso de incorporación. Los programadores más jóvenes en su mayoría respondieron a estas preguntas, debido a que suelen incorporarse a esa edad a las empresas o se encargan también de incorporar gente nueva.

Situación de busqueda de empleo

Utilizamos gáficos de barra en base al total de encuestados por región ya que nos permite identificar claramente y de manera ordenada las diferencias de la situación de empleo de los programadores por región.

Podemos observar que la cantidad de programadores que buscan empleo es mayor en América Latina, y la cantidad de programadores que no buscan empleo es mucho mayor en Estados Unidos. Esto puede deberse a que hay mayor disponibilidad de trabajos en Estados Unidos que en América Latina y también que los desarrolladores en Estados Unidos ya tienen estabilidad laboral.

Leguajes de programación

Para esta variabe se hizo uso de un barplot por separado para cada region, debido a que existe una cantidad de lenguajes de programación considerable, Además un gráfico de barras nos permite visualizar en que lenguajes se trabajan más, para facilitar esta comparación se ordeno el barplot en orden descendente.

Se destaca que entre los lenguajes más usados tanto en Estados Unidos como en América Latina son JavaScript, HTML/CSS, SQL. Es importante resaltar que en Estados Unidos hay un mayor uso de Python que en América Latina.

Frecuencia de aprendizaje de un nuevo lenguaje

#usa
temp = DF_USA$NEWLearn[!is.na(DF_USA$NEWLearn)]

tiemponames <- c("Pocos meses", "Una por década", "Una vez al año", "Pocos años")

tabla_NEWLearn_USA_F = table(temp)
tabla_NEWLearn_USA_FR = prop.table(tabla_NEWLearn_USA_F)
tabla_NEWLearn_USA_P = data.frame(tiemponames, as.vector(tabla_NEWLearn_USA_F), as.vector(tabla_NEWLearn_USA_FR))

names(tabla_NEWLearn_USA_P) <- c('Tiempo de aprendizaje USA', 'Frecuencia', 'Frecuencia Relativa')
tabla_NEWLearn_USA_P
par(mfrow=c(1, 2))

barplot(tabla_NEWLearn_USA_FR, names.arg=tiemponames, xlab = 'Tiempo', ylab = 'Frecuencias Relativas', main="Tiempo de aprendizaje USA", col=c("skyblue","orange","red","beige"), ylim = c(0,0.5), cex.names = 0.4, las =0.7)
#LA
temp2 = DF_LA$NEWLearn[!is.na(DF_LA$NEWLearn)]
tabla_NEWLearn_LA_F= table(temp2)
tabla_NEWLearn_LA_FR = prop.table(tabla_NEWLearn_LA_F)

tabla_NEWLearn_LA_P = data.frame(tiemponames, as.vector(tabla_NEWLearn_LA_F), as.vector(tabla_NEWLearn_LA_FR))

names(tabla_NEWLearn_LA_P) <- c('Tiempo de aprendizaje Latinoamérica', 'Frecuencia', 'Frecuencia Relativa')
tabla_NEWLearn_LA_P
barplot(tabla_NEWLearn_LA_FR, names.arg=tiemponames, xlab = 'Tiempo', ylab = 'Frecuencias Relativas', main="Tiempo de aprendizaje LA", col=c("skyblue","orange","red","beige"), ylim = c(0,0.5), cex.names = 0.4, las =0.7)

Para esta variable también se hace uso de un gráfico de barras ya que nos permite ver que “tiempo de aprendizaje” es más común, asimismo esto nos permite una comparación rápida entre ambas regiones para un mejor análisis.

Se observa que en USA la mayoría de los programadores aprenden un nuevo lenguaje cada año, seguido de pocos meses, mientras que en Latinoamérica la mayoría aprenden un nuevo lenguaje cada pocos meses, seguido de un año. Resaltando que en Latinoamérica hay un mayor ritmo de aprednizaje de un nuevo lenguaje.

Edad a la que realizó primer programa

par(mfrow=c(1,2))  
hist(as.numeric(DF_USA$Age1stCode), probability = TRUE, xlim = c(0,80), ylim = c(0, 0.13), breaks = 30, main = "Edad 1er programa Estados Unidos", ylab = "Frecuencia relativa", xlab = "Edad", cex.main = 0.9)
abline(v = median(as.numeric(DF_USA$Age1stCode), na.rm = TRUE), col = "red")
hist(as.numeric(DF_LA$Age1stCode), probability = TRUE, xlim = c(0,80), ylim = c(0, 0.13), breaks = 30, main = "Edad 1er programa América Latina", ylab = "Frecuencia relativa", xlab = "Edad", cex.main = 0.9)
abline(v = median(as.numeric(DF_LA$Age1stCode), na.rm = TRUE), col = "red")

Decidimos utilizar un histograma porque nos permite observar el comportamiento “normal” de la variable, o sea, una distribución gaussiana. Calculamos las medias para poder comparar la situación de Estados Unidos con la de América Latina. Podemos ver que esta sugiere que existe una diferencia de 2 años entre ambas regiones, sin embargo esta es pequeña y podría ser estadísticamente no significativa.

median(as.numeric(DF_USA$Age1stCode), na.rm = TRUE)
[1] 14
median(as.numeric(DF_LA$Age1stCode), na.rm = TRUE)
[1] 16

Relaciones entre variables

podemos realizar un análisis de interacción entre las variables de edad en la que realizó su primer programa y años programando profesionalmente

DF_USA_T <- DF_USA
#DF_USA_T[(as.numeric(DF_USA_T$Age) < as.numeric(DF_USA_T$Age1stCode) & !is.na(DF_USA_T$Age)),]
DF_LA_T <- DF_LA
plot(x = DF_USA_T$Age, y = DF_USA_T$ConvertedComp)

plot(x = DF_LA_T$Age, y = DF_LA_T$ConvertedComp)

?cov
cor(x = DF_USA_T$Age,y = DF_USA_T$ConvertedComp, use = "complete.obs")
[1] -0.003972984
cor(x = DF_LA_T$Age,y = DF_LA_T$ConvertedComp, use = "complete.obs")
[1] 0.1732658
DF_USA_T <- DF_USA
#DF_USA_T[(as.numeric(DF_USA_T$Age) < as.numeric(DF_USA_T$Age1stCode) & !is.na(DF_USA_T$Age)),]
DF_LA_T <- DF_LA
DF_LA_T
plot(x = DF_USA_T$Age, y = as.double(DF_USA_T$Age1stCode))
abline(lm(Age ~ as.double(Age1stCode), data = DF_USA_T))

plot(x = DF_LA_T$Age, y = as.double(DF_LA_T$Age1stCode))
abline(lm(DF_LA_T$Age ~ as.double(DF_LA_T$Age1stCode)))

DF_USA_T
cov(y = as.double(DF_USA_T$Age),x = as.double(DF_USA_T$Age1stCode), use = "complete.obs")
[1] 2.802763
cov(y = as.double(DF_LA_T$Age),x = as.double(DF_LA_T$Age1stCode), use = "complete.obs")
[1] 3.483694
DF_USA_T <- DF_USA
#DF_USA_T[(as.numeric(DF_USA_T$Age) < as.numeric(DF_USA_T$Age1stCode) & !is.na(DF_USA_T$Age)),]
DF_LA_T <- DF_LA
plot(x = DF_USA_T$YearsCodePro, y = DF_USA_T$ConvertedComp)

plot(x = DF_LA_T$YearsCodePro, y = DF_LA_T$ConvertedComp)

cov(x = as.double(DF_USA_T$YearsCodePro),y = as.double(DF_USA_T$ConvertedComp), use = "complete.obs")
[1] 61278.58
cov(x = as.double(DF_LA_T$YearsCodePro),y = as.double(DF_LA_T$ConvertedComp), use = "complete.obs")
[1] 97014.48
cor(x = as.double(DF_USA_T$YearsCodePro),y = as.double(DF_USA_T$ConvertedComp), use = "complete.obs")
[1] 0.01880294
cor(x = as.double(DF_LA_T$YearsCodePro),y = as.double(DF_LA_T$ConvertedComp), use = "complete.obs")
[1] 0.2120895